#ifndef CLIONQT5WORK_MAINWINDOW_H
#define CLIONQT5WORK_MAINWINDOW_H

#include <QMainWindow>     // 引入 QMainWindow 类，用于创建主窗口
#include <QLabel>          // 引入 QLabel 类，用于显示图像
#include <QPushButton>     // 引入按钮控件
#include <QTextEdit>       // 引入文本编辑器控件
#include <QScrollArea>     // 引入滚动区域控件
#include "./ImageLabel/ImageLabel.h" // 自定义图像显示组件，支持鼠标标注
#include <opencv2/opencv.hpp>        // OpenCV 基本头文件
#include <opencv2/features2d.hpp>    // OpenCV 特征提取相关模块

// MainWindow 类，继承自 QMainWindow，用于管理整个 GUI 界面
class MainWindow : public QMainWindow {
Q_OBJECT  // Qt 元对象系统宏，支持信号和槽机制

public:
    // 构造函数和析构函数
    MainWindow(QWidget *parent = nullptr);  // 构造函数，默认父对象为空
    ~MainWindow();                          // 析构函数，释放资源

private slots:
    // 槽函数：响应按钮点击等事件
    void loadImage1();            // 加载图像1
    void loadImage2();            // 加载图像2
    void clearButtonfunction();   // 清除图像标注点的操作

private:
    // 自定义图像显示标签（支持鼠标交互）
    ImageLabel* imageLabel1;  // 图像1的显示区域
    ImageLabel* imageLabel2;  // 图像2的显示区域

    // 原始图像的副本，用于缩放适配或还原
    QPixmap originalPixmap1;  // 图像1的原始副本
    QPixmap originalPixmap2;  // 图像2的原始副本

    // 文本编辑器区域（用于显示匹配信息或调试输出）
    QTextEdit *textEditor;

    // 滚动区域用于包含图像显示控件，支持图像大尺寸浏览
    QScrollArea *scrollArea1;
    QScrollArea *scrollArea2;

    // 图像匹配和映射点的核心函数
    void matchAndMapPoints();  // 使用特征匹配后映射标注点

    // OpenCV 变量 - 图像数据及匹配信息
    cv::Mat img1_gray, img2_gray;                  // 灰度图，用于特征提取
    std::vector<cv::KeyPoint> kp1, kp2;            // 图像1与图像2的关键点集合
    cv::Mat des1, des2;                            // 描述子（用于匹配）
    std::vector<cv::DMatch> goodMatches;           // 筛选后的优质匹配结果
    std::vector<cv::Point2f> src_pts, dst_pts;     // 源图像与目标图像的匹配点坐标

protected:
    // 重写窗口调整大小事件，自动适配图像缩放
    void resizeEvent(QResizeEvent* event) override;
};

#endif // CLIONQT5WORK_MAINWINDOW_H
